﻿Imports PTIC_GestionBDD
Imports PTIC_Util
Imports PTIC_Util.GestionCalculs
Imports Actuariat.Comptes
Imports Actuariat
Imports System.Data
Imports OMANE.Common.Model.Interfaces
Imports OMANE.Common.Model.Parametrage
Imports System.Xml

Namespace moteurTauxGaranti1
    ''' <summary>
    ''' Moteur de calcul du taux garanti par la méthode de l'équilibre technique - VersionSAS
    ''' </summary>
    ''' <remarks></remarks>
    Public Class IntegMoteur_MethodeEqTarif_VSAS
        Inherits Traitement
        Implements IIntegMoteur_MethodeEqTarif

#Region "Variables de classe"
        'Table de travail contenant les segments et toutes leur caractéristiques (paramètres, etc.)
        Protected _tble_travail As DataTable
        'Tables de mortalité H/F, maintien INCAP/INVAL hors franchise, coefficients de réduction à appliquer à cause de la franchise
        'Protected m_tble_mortalite_H As ITableMortalite, m_tble_mortalite_F As ITableMortalite
        'Private m_TbleINCINVTaux As ITableMaintienINCINV_Tx
        'Private m_TbleINCINVFra As ITableMaintienINCINV_Fra
        'Résultats du calcul / Scénario central / Simulations
        Protected _resultatsCalcul As resultatsMoteur1
        Protected _scenarioCentral As scenarioCentralMoteur1
        Protected _simulations As IsimulationsMoteur1
        Protected _Connection As IConnection
#End Region

#Region "Création d'une instance"
        ''' <summary>
        ''' Constructeur
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub New(ByVal nom As String, _
                       ByVal TraitEntreeModeleEqTarif As Traitement, _
                       ByVal DataSetOMANE As DataSet, _
                       ByVal Referentiel As IReferentielOMANE,
                       ByVal Connection As IConnection)

            MyBase.New(nom, Nothing)
            _Connection = Connection
            m_Referentiel = Referentiel
            m_TraitementEntree = TraitEntreeModeleEqTarif
            AddHandler m_TraitementEntree.EtatCalculDataTableAChange, AddressOf onTraitEntree_EtatCalculDataTableChanged

            m_DataSet = DataSetOMANE
            'Collection de paramètres afférents à l'étude en cours
            'Objet permettant de stocker les résultats du moteur et du scénario central
            _resultatsCalcul = New resultatsMoteur1()
            _scenarioCentral = New scenarioCentralMoteur1(Me)
            _simulations = New simulationsMoteur1SAS(Me, Connection)
            _simulations.AjouteFonctionCalculIntermediaire(_scenarioCentral)
            addHandlers()
        End Sub
#End Region

#Region "Propriétés"
        Private m_Referentiel As IReferentielOMANE
        Public ReadOnly Property Referentiel As IReferentielOMANE Implements IIntegMoteur_MethodeEqTarif.Referentiel
            Get
                Return m_Referentiel
            End Get
        End Property

        Private m_DataSet As DataSet
        Public ReadOnly Property DataSetOMANE As DataSet Implements IIntegMoteur_MethodeEqTarif.DataSetOMANE
            Get
                Return m_DataSet
            End Get
        End Property

        Private m_TraitementEntree As Traitement
        Public ReadOnly Property TraitementEntree As Traitement Implements IIntegMoteur_MethodeEqTarif.TraitementEntree
            Get
                Return m_TraitementEntree
            End Get
        End Property

        ''' <summary>
        ''' Liste des paramètres utilisés dans les calculs
        ''' </summary>
        ''' <remarks></remarks>
        Public Property listeParametres() As ParametresList Implements IIntegMoteur_MethodeEqTarif.listeParametres
            Get
                Return Nothing
            End Get
            Set(ByVal value As ParametresList)
                'If Not value Is _coll_param Then
                ' RemoveHandlersListeParametres()
                '_coll_param = value
                'addHandlersListeParametres()
                'End If
            End Set
        End Property

        ''' <summary>
        ''' Etat de calcul du scénario central
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property etatCalculScenCentral() As ValueEtatCalcul Implements IIntegMoteur_MethodeEqTarif.etatCalculScenCentral
            Get
                Return _scenarioCentral.EtatCalcul
            End Get
        End Property

        ''' <summary>
        ''' Etat de calcul des simulations
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property etatCalculSimulations() As ValueEtatCalcul Implements IIntegMoteur_MethodeEqTarif.etatCalculSimulations
            Get
                Return simulations.EtatCalcul
            End Get
        End Property

        ''' <summary>
        ''' Table en entrée utilisée dans la procédure de calcul et issue des encours retraités
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property tableTravail() As DataTable Implements IIntegMoteur_MethodeEqTarif.tableTravail
            Get
                Return _tble_travail
            End Get
        End Property

        ''' <summary>
        ''' Scénario central du moteur de calcul 1
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property ScenarioCentral As scenarioCentralMoteur1 Implements IIntegMoteur_MethodeEqTarif.ScenarioCentral
            Get
                Return _scenarioCentral
            End Get
        End Property

        ''' <summary>
        ''' Prime pure résultant du dernier calcul du moteur
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property PPurePf() As Double Implements IIntegMoteur_MethodeEqTarif.PPurePf
            Get
                Return _resultatsCalcul.PPurePf
            End Get
        End Property

        ''' <summary>
        ''' Prime technique résultant du dernier calcul du moteur
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property PTechPf() As Double Implements IIntegMoteur_MethodeEqTarif.PTechPf
            Get
                Return _resultatsCalcul.PTechPf
            End Get
        End Property

        ''' <summary>
        ''' Somme des capitaux résultant du dernier calcul du moteur
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property sommeCSR() As Double Implements IIntegMoteur_MethodeEqTarif.sommeCSR
            Get
                Return _resultatsCalcul.sommeCSR
            End Get
        End Property

        ''' <summary>
        ''' Somme des capitaux sous rique du scénario central
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property sommeCSR_ScenCentral() Implements IIntegMoteur_MethodeEqTarif.sommeCSR_ScenCentral
            Get
                Return _scenarioCentral.resultats.sommeCSR
            End Get
        End Property

        ''' <summary>
        ''' Simulations attachées au moteur de calcul
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property simulations() As IsimulationsMoteur1 Implements IIntegMoteur_MethodeEqTarif.simulations
            Get
                Return _simulations
            End Get
        End Property
#End Region

#Region "Calculs"

#Region "Initialisation des calculs"

#Region "Table en entrée + Tables de travail"
        ''' <summary>
        ''' Initialisation des tables de travail nécessaires au modèle 1
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub init_tbles_travail(ByVal Referentiel As IReferentielOMANE) Implements IIntegMoteur_MethodeEqTarif.init_tbles_travail

            'Ligne ajoutée pour la version SAS (calcul sous SAS de la table d'entrée de traitMoteur1) :
            TraitementEntree.Calculer_BDD()
            'TraitementEntree.Calculer_DataTable()

            'Récupération de la table de travail dans une variable
            _tble_travail = TraitementEntree.DataTableResultat
            If DataSetOMANE.Tables.Contains(_tble_travail.TableName) Then DataSetOMANE.Tables.Remove(_tble_travail.TableName)
            DataSetOMANE.Tables.Add(_tble_travail)

            'TableMortalite_H_Initialize(Referentiel)
            'TableMortalite_F_Initialize(Referentiel)
            'TableMaintienINCINV_Fra_Initialize(Referentiel)
            'TableMaintienINCINV_Tx_Initialize(Referentiel)

        End Sub
#End Region

        ''' <summary>
        ''' Permet d'initialiser la procédure de calcul
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub calculeInit() Implements IIntegMoteur_MethodeEqTarif.calculeInit
            init_tbles_travail(Referentiel)
        End Sub
#End Region

#Region "Héritage classe traitement (vide à l'heure actuelle)"
        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Protected Overrides Sub execute_DataTable()
            MsgBox("Fonction à modifier")
        End Sub

        'Public Overrides Function execute_DataTableToDgv(ByVal stockageBDDlocale As Boolean, ByVal dgv As System.Windows.Forms.DataGridView) As System.Data.DataTable
        '    MsgBox("La fonction execute_DataTableToDgv du moteur de calcul 1 est en cours de développement")
        '    Return Nothing
        'End Function

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Protected Overrides Sub execute_BDD()
            'Vérifier que le traitement est à jour dans la base de données
        End Sub
#End Region

        ''' <summary>
        ''' Permettant de calculer le scénario central
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub calculerScenarioCentral() Implements IIntegMoteur_MethodeEqTarif.calculerScenarioCentral
            _scenarioCentral.Calculer()
        End Sub

        ''' <summary>
        ''' Permettant de calculer toutes les simulations
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub calculerSimulations() Implements IIntegMoteur_MethodeEqTarif.calculerSimulations
            simulations.Calculer()
        End Sub

        ''' <summary>
        ''' Procédure de calcul, utilisée à la fois par le scénario central et les simulations
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub calcule(ByVal isScenarioCentral As Boolean, Optional SimulChoc As SimulationChoc = Nothing) Implements IIntegMoteur_MethodeEqTarif.calcule

            'Placer la table de travail au bon endroit
            '(A voir si cette étape est laissée ici ou non selon les besoins liés aux simulations)

            ''Exécuter le code SAS
            Dim ParamLibname As String = "RepRef=" & csteEmplacementReferentiel & " RepInt=" & csteEmplacementCalculsInt

            _Connection.ExecuteStoredProcess(csteEmplacementReferentiel, "CalculTxGarEqTarifaireScenCent", ParamLibname)

            'Récupération de la table SAS contenant les calculs détaillés
            Dim ResultatsDet As New TableBDD_SAS("TxGarEqTarifResDet",
                New Cla_NomFichier(csteEmplacementCalculsInt & "traitmodeltxgareqtarifdet.sas7bdat"),
                Me._Connection.Connection,
                csteLibSASCalculsInt)

            'Récupération de la table contenant les résultats agrégés
            Dim ResultatsAg As New TableBDD_SAS("TxGarEqTarifResAg",
                New Cla_NomFichier(csteEmplacementCalculsInt & "traitmodeltxgareqtarifres.sas7bdat"),
                Me._Connection.Connection,
                csteLibSASCalculsInt)

            'Les résultats détaillés sont mis dans la table de travail pour affichage dans l'outil
            _tble_travail = ResultatsDet.execute_DataTableSortie(False)

            'Les résultats agrégés sont mis dans l'objet contenant les résultats des calculs
            Dim tResultatsAg As DataTable = ResultatsAg.execute_DataTableSortie(False)
            _resultatsCalcul.PPurePf = tResultatsAg.Rows(0)("PPPF")
            _resultatsCalcul.PTechPf = tResultatsAg.Rows(0)("PTECHPF")
            _resultatsCalcul.sommeCSR = tResultatsAg.Rows(0)("SUMCSR")

        End Sub

        ''' <summary>
        ''' Permet de rétablir l'environnement de travail à la fin de la procédure de calcul
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub calculeCloture() Implements IIntegMoteur_MethodeEqTarif.calculeCloture
        End Sub
#End Region

#Region "Traitement des évènements reçus de l'extérieur"

#Region "Gestion des Handles"
        ''' <summary>
        ''' Abonnement de la classe aux évènements qui lui sont utiles
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub addHandlers()
            'Placer le moteur 1 comme observateur de tous les paramètres influençant son calcul
            'Cette classe joue ici le rôle de médiateur et de façade
            AddHandler _scenarioCentral.EtatCalculChanged, AddressOf onScenarioCentralEtatCalculChanged
            AddHandler _simulations.EtatCalculChanged, AddressOf onSimulationsEtatCalculChanged
        End Sub

#End Region

        Private Sub onScenarioCentralEtatCalculChanged(ByVal sender As Object, ByVal e As EventArgs)
            If _scenarioCentral.EtatCalcul <> ValueEtatCalcul.A_JOUR Then
                _simulations.Invalider()
            End If
            RaiseEvent EtatCalculScenCentralChanged(Me, e)
        End Sub
        Private Sub onSimulationsEtatCalculChanged(ByVal sender As Object, ByVal e As EventArgs)
            RaiseEvent EtatCalculSimulationsChanged(Me, e)
        End Sub
        Private Sub onParametreChanged(ByVal sender As Object, ByVal e As EventArgs)
            _scenarioCentral.Invalider()
        End Sub

        ''' <summary>
        ''' Le traitement en entrée du moteur de calcul a été modifié. La notification est envoyée par la liste de
        ''' traitements OMANE
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub onTraitEntree_EtatCalculDataTableChanged(ByVal sender As Object, ByVal e As EventArgs) Implements IIntegMoteur_MethodeEqTarif.onTraitEntree_EtatCalculDataTableChanged
            If CType(sender, Traitement).EtatCalcul_DataTable = ValueEtatCalcul.A_MAJ Then
                Me._scenarioCentral.Invalider()
            End If
        End Sub

#End Region

#Region "Evènements générés"
        Public Event EtatCalculScenCentralChanged As EventHandler Implements IIntegMoteur_MethodeEqTarif.EtatCalculScenCentralChanged
        Public Event EtatCalculSimulationsChanged As EventHandler Implements IIntegMoteur_MethodeEqTarif.EtatCalculSimulationsChanged
#End Region

    End Class

End Namespace
